/**
 * 代理类 - 代理模式中的代理主题
 * 
 * 实现了Subject接口，并持有一个RealSubject的引用
 * 在调用真实主题方法前后添加额外的处理逻辑，如访问控制、日志记录等
 */
package com.mkx.structurals.proxy;

public class Proxy implements Subject {
    // 持有真实主题的引用
    private RealSubject realSubject;
    
    @Override
    public void request() {
        // 在调用真实主题之前的预处理操作
        preRequest();
        
        // 如果真实主题不存在，则创建
        if (realSubject == null) {
            realSubject = new RealSubject();
        }
        
        // 调用真实主题的方法
        realSubject.request();
        
        // 在调用真实主题之后的后续操作
        postRequest();
    }
    
    /**
     * 调用前的预处理
     */
    private void preRequest() {
        System.out.println("代理：请求前的预处理");
    }
    
    /**
     * 调用后的后续处理
     */
    private void postRequest() {
        System.out.println("代理：请求后的后续处理");
    }
}